package com.demos.cqp.dnt.mvc.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.demos.cqp.dnt.dao.DAO;
import com.demos.cqp.dnt.dao.DAOException;
import com.demos.cqp.dnt.dao.DvdthequeDAO;
import com.demos.cqp.dnt.domain.DVD;
import com.demos.cqp.dnt.domain.Utilisateur;

/**
 * Servlet implementation class DVDController
 */
@WebServlet("/DVDController")
public class DVDController extends HttpServlet {

	@Inject @DAO
	private DvdthequeDAO dao;

	private static final long serialVersionUID = 1L;

	/**
	 * Default constructor.
	 */
	public DVDController() {
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		if (request.getParameter("idDvd") != null) {
			doDelete(request, response);
		} else {
			doLoad(request, response);
		}
	}

	protected void doLoad(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		try {
			HttpSession session = req.getSession();
			Utilisateur user = (Utilisateur) session.getAttribute("user");
			session.setAttribute("user", user);
			List<DVD> listeDVD;
			listeDVD = dao.charger(user);
			req.setAttribute("listeDVD", listeDVD);
			req.getRequestDispatcher("/listeDVD.jsp").forward(req, resp);
		} catch (DAOException e) {
			req.setAttribute("error", e.getClass() + " : " + e.getMessage());
			req.getRequestDispatcher("/error.jsp").forward(req, resp);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		if (request.getParameter("idDvd") != null) {
			doLoadUpdate(request, response);
		} else {
			doPut(request, response);
		}
	}

	@Override
	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		super.service(req, res);
	}

	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		long id = Long.parseLong(req.getParameter("idDvd"));
		
		try {
			dao.delete(id);
			doLoad(req, resp);
		} catch (DAOException e) {
			req.setAttribute("error", e.getClass() + " : " + e.getMessage());
			req.getRequestDispatcher("/error.jsp").forward(req, resp);
		}
	}

	@Override
	protected void doPut(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		try {

			// R�cuperation de la session et ajout d'une DVDTheque vierge si pas
			// d�j�
			// fait
			HttpSession session = request.getSession();

			Utilisateur user = (Utilisateur) session.getAttribute("user");
			session.setAttribute("user", user);

			session.setAttribute("genres", DVD.Genre.values());

			// Liste d'erreurs
			List<String> listeErreurs = new ArrayList<String>();
			request.setAttribute("listeErreurs", listeErreurs);

			RequestDispatcher rd = null;

			String titre = request.getParameter("letitre");
			if (titre.equals("")) {
				listeErreurs.add("Le titre est Obligatoire !");
			}

			String realisateur = request.getParameter("lerealisateur");
			String acteur1 = request.getParameter("lacteur1");
			String acteur2 = request.getParameter("lacteur2");
			int note = 0;
			if (!request.getParameter("lanote").equals("")) {
				try {
					note = Integer.parseInt(request.getParameter("lanote"));
				} catch (NumberFormatException nfe1) {
					listeErreurs.add("La note doit �tre au format num�rique");
				}
			}

			DVD.Genre genre = null;
			try {
				genre = DVD.Genre.valueOf(request.getParameter("legenre"));
			} catch (java.lang.IllegalArgumentException e) {
				// Ne rien faire
			}

			int duree = 0;
			if (!request.getParameter("laduree").equals("")) {
				try {
					duree = Integer.parseInt(request.getParameter("laduree"));
				} catch (NumberFormatException nfe1) {
					listeErreurs.add("La dur�e doit �tre au format num�rique");
				}
			}

			if (listeErreurs.isEmpty()) {

				// Mise � Jour du DVD

				if (request.getParameter("idUpdateDvd") != null
						&& !request.getParameter("idUpdateDvd").equals("")) {
					DVD updateDVD = null;
					long id = Long.parseLong(request
							.getParameter("idUpdateDvd"));
					updateDVD = dao.consulter(id);
					updateDVD.setTitre(titre);
					updateDVD.setRealisateur(realisateur);
					updateDVD.setActeurs(new String[] { acteur1, acteur2 });
					updateDVD.setNote(note);
					updateDVD.setGenre(genre);
					updateDVD.setDuree(duree);

					dao.mettreAJour(updateDVD);
					doLoad(request, response);
					return;

				} else {

					// Ajout du DVD dans la DVDTheque: listeDVD

					DVD dvd = new DVD(titre, realisateur, new String[] {
							acteur1, acteur2 }, note, genre, duree);
//					DVD.incLastId();
//					dvd.setId(DVD.getLastId());
					dao.enregistrer(dvd, user);
					
					doLoad(request, response);
					return;
				}
			} else {
				request.setAttribute("letitre", titre);
				request.setAttribute("lerealisateur", realisateur);
				request.setAttribute("lacteur1", acteur1);
				request.setAttribute("lacteur2", acteur2);
				request.setAttribute("legenre", genre);
				request.setAttribute("lanote", note);
				request.setAttribute("laduree", duree);
				rd = request.getRequestDispatcher("/saisieDVD.jsp");
			}

			rd.forward(request, response);
		} catch (DAOException e) {
			request.setAttribute("error", e.getClass() + " : " + e.getMessage());
			request.getRequestDispatcher("/error.jsp").forward(request,
					response);
		}
	}

	protected void doLoadUpdate(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {

			// R�cuperation de la session et ajout d'une DVDTheque vierge si pas
			// d�j�
			// fait
			HttpSession session = request.getSession();

			Utilisateur user = (Utilisateur) session.getAttribute("user");
			session.setAttribute("user", user);
			session.setAttribute("genres", DVD.Genre.values());

			RequestDispatcher rd = null;

			// Mise � Jour du DVD

			int id = Integer.parseInt(request.getParameter("idDvd"));
			DVD updateDVD = dao.consulter(id);

			request.setAttribute("updateDVD", updateDVD);

			request.setAttribute("letitre", updateDVD.getTitre());
			request.setAttribute("lerealisateur", updateDVD.getRealisateur());
			request.setAttribute("lacteur1", updateDVD.getActeurs()[0]);
			request.setAttribute("lacteur2", updateDVD.getActeurs()[1]);
			request.setAttribute("legenre", updateDVD.getGenre());
			request.setAttribute("lanote", updateDVD.getNote());
			request.setAttribute("laduree", updateDVD.getDuree());

			rd = request.getRequestDispatcher("/saisieDVD.jsp");

			rd.forward(request, response);

		} catch (DAOException e) {
			request.setAttribute("error", e.getClass() + " : " + e.getMessage());
			request.getRequestDispatcher("/error.jsp").forward(request,
					response);
		}

	}

}
